14. Librerie e file esterni

Costruendo delle vere applicazioni web in PHP, vi accorgerete che sarà impossibile sviluppare del codice ordinato e flessibile senza suddividere l'applicazione in più file o librerie.

Vedremo ora come è possibile creare una libreria esterna all'applicazione includendola in quest'ultima.
Per farlo è necessario creare un nuovo file, dove sarà possibile inserire variabili, funzioni, oggetti e tutto il resto come avviene in una normale pagina PHP.

Solitamente quando si crea un nuovo file di libreria, gli si assegna una estensione .inc che sta per include, ma in questo modo se non viene configurato correttamente il server, il codice diventa leggibile dall'esterno, creando problemi di sicurezza.

Vi potrà capitare di produrre del codice che non installerete voi, perciò vi consiglio in ogni caso, di dare l'estensione .php anche ai file di libreria, in modo che vengano sempre interpretati come tali dal server rendendo illegibile il codice dal lato client.


Include & Require

PHP ci mette a disposizione quattro costrutti del linguaggio, non richiamabili quindi con il metodo delle variabili funzione :

  • include() - Include il file specificato e solleva un Warning se non viene trovato.
  • require() - Include il file specificato e solleva un Fatal error se non viene trovato interrompendo l'esecuzione dello script.
  • include_once() - Include il file specificato durante l'esecuzione dello script e solleva un Warning se non viene trovato.
    Se il file è stato già incluso, include_once non lo includerà nuovamente.
  • require_once() - Include il file specificato durante l'esecuzione e solleva un Fatal error se non viene trovato interrompendo l'esecuzione dello script. Se il file è stato già incluso, require_once non lo includerà nuovamente.

L'unica differenza fra i metodi include e require, è la gestione degli errori.

Include infatti solleva un Warning che non interrompe l'esecuzione dello script, mentre require produce un Fatal error, non esitate quindi ad usare require se il file incluso è di vitale importanza per la corretta esecuzione dello script.


Esempio di file esterno

Creeremo ora un nuovo file con estensione .php, per contenere alcune variabili e funzioni che useremo nell'applicazione principale, e che chiameremo "libreria.php" (N.B. : fate attenzione all'estensione del file, se siete sotto Windows assicuratevi di avere disattivato l'opzione "Nascondi le estensioni per i tipi di file conosciuti" sotto "Strumenti" -> "Opzioni cartella..." -> "Visualizzazione").

<?php
	// libreria.php

	$settimana = array();
	array_push($settimana, "Domenica");
	array_push($settimana, "Lunedì");
	array_push($settimana, "Martedì");
	array_push($settimana, "Mercoledì");
	array_push($settimana, "Giovedì");
	array_push($settimana, "Venerdì");
	array_push($settimana, "Sabato");

	function stampaData()
	{
		global $settimana;

		$data = "Oggi è " . $settimana[date("w" ,time())];
		$data .= " " . date("d/m/Y - G:i", time());

		return $data;
	}
?>

Ora includiamo la nostra libreria tramite la direttiva require_once per richiamare la nuova funzione "stampaData()" :

<?php require_once("libreria.php"); ?>

<html>
	<head>
		<title>Test</title>
	</head>

	<body>

	<?php echo stampaData(); ?>
	</body>
</html>

Questo è il risultato ottenuto.

Ci sono due sintassi corrette per utilizzare questi costrutti :

  • require_once("libreria.php");
  • require_once "libreria.php";

Potete usarli all'interno dei blocchi condizionali come IF ELSE, con l'accorgimento di racchiuderli sempre fra parentesi graffe, anche quando c'è solo un'istruzione, o potreste avere effetti indesiderati :

// Esempio corretto
if ($condizione)
{ include "libreria1.php"; }
else
{ include "libreria2.php"; }

Inoltre, essendo dei costrutti speciali che non richiedono parentesi tonde, bisogna prestare particolare attenzione quando si effettuano dei controlli sui valori che restituiscono, avendo cura di usare la seguente sintassi :

// Non corretto
if (include('libreria.php') == 'success')
{ echo 'OK'; }
 
// Corretto
if ((include 'libreria.php') == 'success')
{ echo 'OK'; }

Come si intuisce dall'esempio precedente, è possibile gestire i valori restituiti da include e require, semplicemente utilizzando il costrutto return nel file che si desidera includere.
Per capire meglio riporto direttamente l'esempio della Documentazione Ufficiale di PHP :

<?php
	// file "return.php"

	$var = 'PHP';
	return $var;
?>

<?php
	// file "noreturn.php"

	$var = 'PHP';
?>

<?php
	// file "testreturns.php"

	$temp = include 'return.php';
	echo $temp; // Stampa : 'PHP'

	$temp = include 'noreturn.php';
	echo $temp; // Stampa : 1
?>

Se includete un file all'interno di una funzione, tutto il codice all'interno del file sarà come se fosse stato dichiarato e definito all'interno di questa funzione, di conseguenza le variabili non saranno accesibili dall'esterno a meno di non essere dichiarate come globali.